﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using PraxisRent.Entities;
using PraxisRent.BL;
using Microsoft.Practices.Unity;

namespace PraxisRent.UI
{
    public partial class FrmMttoCredito : Form
    {
        [Dependency]
        public ICreditoBL creditoBL { get; set; }

        [Dependency]
        public IAlquilerBL alquiBL { get; set; }

        [Dependency]
        public IPagoBL pagoBL { get; set; }

        public FrmMttoCredito()
        {
            InitializeComponent();
            this.BuilUp();
        }

        bool isNew;
        decimal total = 0;

        public class ItemPago
        {
            public DateTime Fecha { get; set; }
            public decimal Abono { get; set; }
        }

        List<ItemPago> listaCantidadPagos = new List<ItemPago>();

        public void NuevoCredito()
        {
            isNew = true;
            cREDITOBindingSource.AddNew();
        }

        public CREDITO _credito { get; set; }
        public ALQUILER _alquiler { get; set; }

        public void nuevoCreditoByAlquiler()
        {
            isNew = true;
            cREDITOBindingSource.AddNew();
            txtAlquiler.Text = Convert.ToString(_alquiler.Codigo);
            txtAlquiler.ReadOnly = true;
            fechaEmisionDateTimePicker.Value = DateTime.Now;
            lblMontoTotal.Text = Convert.ToString(_alquiler.Monto);
            total = _alquiler.Monto;
        }

        public void EditarCredito()
        {
            cREDITOBindingSource.DataSource = _credito;
        }

        private void FrmMttoCredito_Load(object sender, EventArgs e)
        {
            //cREDITOBindingSource.AddNew();
        }

        public void VerificarAlquiler()
        {
            if (Convert.ToInt32(txtAlquiler.Text) > 0)
            {
                var alquiler = alquiBL.GetAllFromAlquilerByCodigo(Convert.ToInt32(txtAlquiler.Text));

                if (alquiler != null)
                {
                    fechaEmisionDateTimePicker.Value =  alquiler.FechaEntrega;
                    lblMontoTotal.Text = Convert.ToString(alquiler.Monto);
                    total = alquiler.Monto;
                }
                else
                {
                    MessageBox.Show("Alquiler no Existente", "Mensaje");
                }
            }
            else
            {
                MessageBox.Show("Ingrese un código de Alquiler", "Mensaje");
            }
        }

        private void codigoTextBox_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                VerificarAlquiler();
            }
        }

        private void txtAlquiler_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
        {
            if (e.KeyCode == Keys.Tab)
            {
                VerificarAlquiler();
            }
        }

        private void BtnGuardar_Click(object sender, EventArgs e)
        {
            var credito = cREDITOBindingSource.Current as CREDITO;
            var pago = new PAGO();

            var msg = "ERROR";
            if (chbxCuotas.Checked == true)
            {
                if (credito != null)
                {
                    if (isNew == true)
                    {
                        try
                        {
                            credito.Cancelado = false;
                            credito.FechaEmision = fechaEmisionDateTimePicker.Value;
                            credito.FechaVencimiento = fechaVencimientoDateTimePicker.Value;
                            credito.Total = total;
                            credito.CodigoAlquiler = Convert.ToInt32(txtAlquiler.Text);
                            creditoBL.AddCredito(credito);

                            // generamos las cuotas del CREDITO
                            foreach (var item in listaCantidadPagos)
                            {
                                pago.IdCredito = credito.Id;
                                pago.FechaLimite = item.Fecha;
                                pago.Abono = item.Abono;
                                pago.NumComprobante = "0000000000";
                                pago.Cancelado = false;
                                pagoBL.AddPago(pago); 
                            }
                        
                            MessageBox.Show("Registro Correcto ", "Registro",
                            MessageBoxButtons.OK, MessageBoxIcon.Information);
                            this.Close();
                        }
                        catch (Exception ex)
                        {
                            msg = ex.Message;
                            MessageBox.Show(msg, "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        }
                    }
                }
            }
            else
            {
                MessageBox.Show("Necesita Generar la cantidad de Pagos", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        private void btnGenerar_Click(object sender, EventArgs e)
        {
            GenerarCuotas();
        }

        public void GenerarCuotas()
        {
            int cantCuotas = Convert.ToInt32(num_pagosTextBox.Text);
            decimal montoPorCuota = decimal.Round((total / cantCuotas),2);
            DateTime fechaInicio = fechaEmisionDateTimePicker.Value;

            if (cbxPlazo.SelectedIndex.Equals(0))    //validamos que las cuotas se generen SEMANALMENTE
            {
                DateTime fechaFin = fechaInicio.AddDays(7*cantCuotas);    
                for (int i = 1; i <= cantCuotas; i++)
                {
                    ItemPago item = new ItemPago()
                    {
                        Fecha = fechaInicio.AddDays(7 * i),
                        Abono = montoPorCuota
                    };
                    listaCantidadPagos.Add(item);
                }
                dgvPagos.DataSource = listaCantidadPagos;
                fechaVencimientoDateTimePicker.Value = fechaFin;
                chbxCuotas.Checked = true;
            }
            else if (cbxPlazo.SelectedIndex.Equals(1))     //validamos que las cuotas se generen QUINCENALMENTE
            {
                DateTime fechaFin = fechaInicio.AddDays(15*cantCuotas);    
                for (int i = 1; i <= cantCuotas; i++)
                {
                    ItemPago item = new ItemPago()
                    {
                        Fecha = fechaInicio.AddDays(15 * i),
                        Abono = montoPorCuota
                    };
                    listaCantidadPagos.Add(item);
                }
                dgvPagos.DataSource = listaCantidadPagos;
                fechaVencimientoDateTimePicker.Value = fechaFin;
                chbxCuotas.Checked = true;
            }
            else if (cbxPlazo.SelectedIndex.Equals(2))    //validamos que las cuotas se generen MENSUALMENTE
            {
                DateTime fechaFin = fechaInicio.AddMonths(1 * cantCuotas);
                for (int i = 1; i <= cantCuotas; i++)
                {
                    ItemPago item = new ItemPago()
                    {
                        Fecha = fechaInicio.AddMonths(1 * i),
                        Abono = montoPorCuota
                    };
                    listaCantidadPagos.Add(item);
                }
                dgvPagos.DataSource = listaCantidadPagos;
                fechaVencimientoDateTimePicker.Value = fechaFin;
                chbxCuotas.Checked = true;
            }
        }

    }
}
